package com.hsq.ndmall.order.service.impl;

import cn.hutool.core.map.MapUtil;
import com.hsq.ndmall.common.utils.*;
import com.hsq.ndmall.order.entity.CartEntity;
import com.hsq.ndmall.order.entity.OrderGoodsEntity;
import com.hsq.ndmall.order.service.CartService;
import com.hsq.ndmall.order.service.OrderGoodsService;
import com.hsq.ndmall.order.utils.OrderUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.hsq.ndmall.order.dao.OrderDao;
import com.hsq.ndmall.order.entity.OrderEntity;
import com.hsq.ndmall.order.service.OrderService;


@Service("orderService")
public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> implements OrderService {

//    @Autowired
//    private OrderDao orderDao;

//    @Autowired(required = false)
//    private PromotionFeignClient promotionFeignClient;
//
////    @Autowired
////    private WxPayFeignClient wxPayFeignClient;
//    @Autowired(required = false)
//    private UserFeignClient userFeignClient;
//
//    @Autowired
//    private CouponFeignClient couponFeignClient;

    @Autowired
    private OrderGoodsService orderGoodsService;
//    @Autowired
//    private ProductFeignClient productFeignClient;


    //@Autowired
    //private RabbitTemplate rabbitTemplate;

    @Autowired
    private CartService cartService;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<OrderEntity> page = this.page(
                new Query<OrderEntity>().getPage(params),
                new QueryWrapper<OrderEntity>()
        );

        return new PageUtils(page);
    }
//
//    @Override
//    public R submit(Integer userId, String body) {
//        if (userId == null) {
//            return R.unlogin();
//        }
//        //2.是否带参数
//        if (body == null) {
//            return R.badArgument();
//        }
//        //3.通过jacksonUtil工具类解析参数
//        Integer cartId = JacksonUtil.parseInteger(body, "cartId");
//        Integer addressId = JacksonUtil.parseInteger(body, "addressId");
//        Integer couponId = JacksonUtil.parseInteger(body, "couponId");
//        Integer userCouponId = JacksonUtil.parseInteger(body, "userCouponId");
//        String message = JacksonUtil.parseString(body, "message");
//        Integer grouponRulesId = JacksonUtil.parseInteger(body, "grouponRulesId");
//        Integer grouponLinkId = JacksonUtil.parseInteger(body, "grouponLinkId");
//
//        //4.如果是团购项目,验证活动是否有效
//        if (grouponRulesId != null && grouponRulesId > 0) {
//            R rRules = promotionFeignClient.queryById(grouponRulesId);
//            //找不到记录
//            if (rRules.get("grouponRules") == null) {
//                return R.badArgument();
//            }
//            //团购活动已经过期
//            if (promotionFeignClient.isExpired(((Map) rRules.get("grouponRules")).get("id"))) {
//
//                return R.error(WxResponseCode.GROUPON_EXPIRED.getCode(), "团购活动已过期!");
//            }
//        }
//        //5.检验是否为购物车提交是否填写了收获地址是否带优惠券id (-1没有使用优惠券)
//        if (cartId == null || addressId == null || couponId == null) {
//            return R.badArgument();
//        }
//
//        // 6、收货地址
//        R checkedAddress = userFeignClient.query(userId, addressId);
//        if (checkedAddress == null) {
//            return R.badArgument();
//        }
//
//        // 7、计算团购优惠金额
//        BigDecimal grouponPrice = new BigDecimal(0.00);
//        R grouponRules = null;
//
//        if (grouponRulesId != null && grouponRulesId > 0) {
//            grouponRules = promotionFeignClient.queryById(grouponRulesId);
//            Object grouponRulesObj = grouponRules.get("grouponRules");
//
//            if (grouponRulesObj != null) {
//                grouponPrice = new BigDecimal(((Map) grouponRulesObj).get("discount").toString());
//            }
//        }
//
//        // 8、获取付款的购物车信息  货品价格
//        List<CartEntity> checkedGoodsList = null;
//        if (cartId.equals(0)) {
//            checkedGoodsList = cartService.queryByUidAndChecked(userId);
//        } else {
//            CartEntity cart = cartService.getById(cartId);
//            if (cart == null) {//未查到购物车信息，或未查到未删除的购物车信息
//                return R.badArgument();
//            }
//            checkedGoodsList = new ArrayList<>(1);
//            checkedGoodsList.add(cart);
//        }
//        if (checkedGoodsList.size() == 0) {
//            return R.badArgumentValue();
//        }
//        //9.计算货品的价格
//        BigDecimal checkedGoodsPrice = new BigDecimal(0.00);
//        for (CartEntity checkGoods : checkedGoodsList) {
//            //  只有当团购规格商品ID符合才进行团购优惠
//            if (grouponRules != null && ((Map) grouponRules.get("grouponRules")).get("goodsId").equals(checkGoods.getGoodsId())) {
//                checkedGoodsPrice = checkedGoodsPrice.add(checkGoods.getPrice().subtract(grouponPrice).multiply(new BigDecimal(checkGoods.getNumber())));
//            } else {
//                checkedGoodsPrice = checkedGoodsPrice.add(checkGoods.getPrice().multiply(new BigDecimal(checkGoods.getNumber())));
//            }
//        }
//
//        // 获取可用的优惠券信息
//        // 10、检测优惠券是否可用，可用则，使用优惠券减免的金额
//        BigDecimal couponPrice = new BigDecimal(0.00);
//        // 如果couponId=0则没有优惠券，couponId=-1则不使用优惠券
//        if (couponId != 0 && couponId != -1) {
//            Map checkCouponParam = new HashMap();
//            checkCouponParam.put("user_id", userId);
//            checkCouponParam.put("coupon_id", couponId);
//            checkCouponParam.put("user_coupon_id", userCouponId);
//            checkCouponParam.put("checked_goods_price", checkedGoodsPrice);
//
//
//            R coupon = couponFeignClient.checkCoupon(checkCouponParam);
//            if (coupon == null) {
//                return R.badArgumentValue();
//            }
//            couponPrice = new BigDecimal(((Map) coupon.get("coupon")).get("discount").toString());
//        }
//
//
//        // 12、根据订单商品总价计算运费，满足条件（例如88元）则免运费，否则需要支付运费（例如8元）；
//        BigDecimal freightPrice = new BigDecimal(0.00);
//        //调用系统服务-获取系统配置 运费慢88减 不足88运费8块 对应ndmall-system 表数据
//        if (checkedGoodsPrice.compareTo(new BigDecimal("88")) < 0) {
//            freightPrice = new BigDecimal("8");
//        }
//
//        // 13.可以使用的其他钱，例如用户积分
//        BigDecimal integralPrice = new BigDecimal(0.00);
//        //TODO  待完善
//
//
//        // 14.订单费用
//        BigDecimal orderTotalPrice = checkedGoodsPrice.add(freightPrice).subtract(couponPrice).max(new BigDecimal(0.00));
//        // 最终支付费用
//        BigDecimal actualPrice = orderTotalPrice.subtract(integralPrice);
//
//        Integer orderId = null;
//        // 15.创建订单
//        OrderEntity order = new OrderEntity();
//
//
//        order.setUserId(userId);
//        //雪花算法生成分布式id
//        order.setOrderSn(OrderUtil.generateOrderSn(userId));
////        order.setOrderStatus(OrderUtil.STATUS_CREATE);
//        order.setOrderStatus(101);
//        order.setConsignee(((Map) checkedAddress.get("address")).get("name").toString());
//        order.setMobile(((Map) checkedAddress.get("address")).get("tel").toString());
//        order.setMessage(message);
//        String detailedAddress = ((Map) checkedAddress.get("address")).get("province").toString() +
//                ((Map) checkedAddress.get("address")).get("city").toString() +
//                ((Map) checkedAddress.get("address")).get("county").toString() +
//                ((Map) checkedAddress.get("address")).get("addressDetail").toString();
//        order.setAddress(detailedAddress);
//        order.setGoodsPrice(checkedGoodsPrice);
//        order.setFreightPrice(freightPrice);
//        order.setCouponPrice(couponPrice);
//        order.setIntegralPrice(integralPrice);
//        order.setOrderPrice(orderTotalPrice);
//        order.setActualPrice(actualPrice);
//
//        // 有团购活动
//        if (grouponRules != null) {
//            order.setGrouponPrice(grouponPrice);    //  团购价格
//        } else {
//            order.setGrouponPrice(new BigDecimal(0.00));    //  团购价格
//        }
//
//        //16. 添加订单表项
//        this.save(order);
//        orderId = order.getId();
//
//        // 17.添加订单商品表项
//        for (CartEntity cartGoods : checkedGoodsList) {
//            // 订单商品
//            OrderGoodsEntity orderGoods = new OrderGoodsEntity();
//            orderGoods.setOrderId(order.getId());
//            orderGoods.setGoodsId(cartGoods.getGoodsId());
//            orderGoods.setGoodsSn(cartGoods.getGoodsSn());
//            orderGoods.setProductId(cartGoods.getProductId());
//            orderGoods.setGoodsName(cartGoods.getGoodsName());
//            orderGoods.setPicUrl(cartGoods.getPicUrl());
//            orderGoods.setPrice(cartGoods.getPrice());
//            orderGoods.setNumber(cartGoods.getNumber());
//            orderGoods.setSpecifications(cartGoods.getSpecifications());
//            orderGoods.setAddTime(new Date());
//
//            orderGoodsService.save(orderGoods);
//
//        }
//
//        //TODO 保存订单发送订单消息
//        //OrderReleaseDto orderReleaseDto=new OrderReleaseDto();
//        //orderReleaseDto.setOrderId(order.getId());
//        //orderReleaseDto.setOrderSn(order.getOrderSn());
//        //log.debug("========发送创建订单{}的消息======",order.getOrderSn());
//        //rabbitTemplate.convertAndSend("order-event-exchange","order.create",orderReleaseDto);
//
//        // 18.删除购物车里面的商品信息
//        cartService.clearGoods(userId);
//
//        //19. 商品货品数量减少
//        for (CartEntity checkGoods : checkedGoodsList) {
//            Integer productId = checkGoods.getProductId();
//            R productR = productFeignClient.findById(productId);
//
//            Short lockNumber = (short) ((int) checkGoods.getNumber());
//            //商品库存
//            int stock = MapUtil.get((Map) productR.get("goodsProduct"), "number", Integer.class);
//            //TODO 剩余库存  = 商品库存-锁定库存总数 这里没有去统计锁定库存数量
//            int residueStock = stock - 0;
//
//            if (lockNumber.intValue() > residueStock) {
//                throw new RuntimeException("下单的商品货品数量大于库存量");
//            }
//            if (Integer.parseInt(productFeignClient.lockStock(orderId, productId, lockNumber).get("errno").toString()) != 0) {
//                throw new RuntimeException("锁定商品货品库存失败");
//            }
//
//        }
//
//        //20.如果使用了优惠券，设置优惠券使用状态
//        if (couponId != 0 && couponId != -1) {
//            R couponUser = couponFeignClient.findById(userCouponId);
//            Map couponUserMap = (Map) couponUser.get("couponUser");
//            couponUserMap.put("status", CouponUserConstant.STATUS_USED);
//            couponUserMap.put("usedTime", LocalDateTime.now());
//            couponUserMap.put("orderId", orderId);
//
//            // int a = 10/0;
//            couponFeignClient.update(couponUserMap);
//        }
//
//        //21.如果是团购项目，添加团购信息
//        if (grouponRulesId != null && grouponRulesId > 0) {
//            Map grouponMap = new HashMap();
//            grouponMap.put("orderId", orderId);
//            grouponMap.put("payed", false);
//            grouponMap.put("userId", userId);
//            grouponMap.put("rulesId", grouponRulesId);
//            //参与者
//            if (grouponLinkId != null && grouponLinkId > 0) {
//                //参与的团购记录
//
//                R baseGroupon = promotionFeignClient.record(grouponLinkId);
//                grouponMap.put("creatorUserId", ((Map) baseGroupon.get("groupon")).get("creatorUserId"));
//
//                grouponMap.put("grouponId", grouponLinkId);
//                grouponMap.put("creatorUserId", ((Map) baseGroupon.get("groupon")).get("shareUrl"));
//
//            } else {
//                grouponMap.put("creatorUserId", userId);
//                grouponMap.put("grouponId", 0);
//
//            }
//
//            R createGrouponResult = promotionFeignClient.createGroupon(grouponMap);
//
//        }
//
//        Map<String, Object> data = new HashMap<>();
//        data.put("orderId", orderId);
//        return R.ok(data);
//    }

}
